home *** CD-ROM | disk | FTP | other *** search
/ MacTech 1 to 12 / MacTech-vol-1-12.toast / Reference / the cmsp digests ('94-'97) / csmp digest Vol 3 No 048 < prev    next >
Internet Message Format  |  1997-05-06  |  40KB

  1. From: pottier@clipper.ens.fr (Francois Pottier)
  2. Subject: csmp-digest-v3-048
  3. Date: Thu, 28 Jul 1994 15:48:03 +0200 (MET DST)
  4.  
  5. C.S.M.P. Digest             Thu, 28 Jul 94       Volume 3 : Issue 48
  6.  
  7. Today's Topics:
  8.  
  9.         Color in System 7 popups?
  10.         Controlling Apple MultiSync Monitors
  11.         Drag Mgr problem w- flavorTypePromiseHFS
  12.         GWorlds and other questions - Help
  13.         PBControl() "hangs" the Macintosh
  14.         Patching the GetResource() toolbox routine
  15.  
  16.  
  17.  
  18. The Comp.Sys.Mac.Programmer Digest is moderated by Francois Pottier
  19. (pottier@clipper.ens.fr).
  20.  
  21. The digest is a collection of article threads from the internet newsgroup
  22. comp.sys.mac.programmer.  It is designed for people who read c.s.m.p. semi-
  23. regularly and want an archive of the discussions.  If you don't know what a
  24. newsgroup is, you probably don't have access to it.  Ask your systems
  25. administrator(s) for details.  If you don't have access to news, you may
  26. still be able to post messages to the group by using a mail server like
  27. anon.penet.fi (mail help@anon.penet.fi for more information).
  28.  
  29. Each issue of the digest contains one or more sets of articles (called
  30. threads), with each set corresponding to a 'discussion' of a particular
  31. subject.  The articles are not edited; all articles included in this digest
  32. are in their original posted form (as received by our news server at
  33. nef.ens.fr).  Article threads are not added to the digest until the last
  34. article added to the thread is at least two weeks old (this is to ensure that
  35. the thread is dead before adding it to the digest).  Article threads that
  36. consist of only one message are generally not included in the digest.
  37.  
  38. The digest is officially distributed by two means, by email and ftp.
  39.  
  40. If you want to receive the digest by mail, send email to listserv@ens.fr
  41. with no subject and one of the following commands as body:
  42.     help                        Sends you a summary of commands
  43.     subscribe csmp-digest Your Name    Adds you to the mailing list
  44.     signoff csmp-digest            Removes you from the list
  45. Once you have subscribed, you will automatically receive each new
  46. issue as it is created.
  47.  
  48. The official ftp info is //ftp.dartmouth.edu/pub/csmp-digest.
  49. Questions related to the ftp site should be directed to
  50. scott.silver@dartmouth.edu. Currently no previous volumes of the CSMP
  51. digest are available there.
  52.  
  53. Also, the digests are available to WAIS users.  To search back issues
  54. with WAIS, use comp.sys.mac.programmer.src. With Mosaic, use
  55. http://www.wais.com/wais-dbs/comp.sys.mac.programmer.html.
  56.  
  57.  
  58. -------------------------------------------------------
  59.  
  60. >From summeral@benji.Colorado.EDU (Summerall  Thomas G)
  61. Subject: Color in System 7 popups?
  62. Date: Tue, 5 Jul 1994 23:13:04 GMT
  63. Organization: University of Colorado, Boulder
  64.  
  65. This is probably a common question, so I apologize in advance.
  66.  
  67. Can the standard system 7 popup cdef use colored menu items?  If so, how?  It
  68. doesn't seem to recognize mctb resources associated with the menu I'm
  69. adding.  What am I missing here?  If it isn't a feature of system 7, is
  70. there a public domain library that can accomplish this?
  71.  
  72. Thanks,
  73.  
  74. Tom Summerall
  75.  
  76.  
  77. +++++++++++++++++++++++++++
  78.  
  79. >From ari@world.std.com (Ari I Halberstadt)
  80. Date: Wed, 13 Jul 1994 01:59:45 GMT
  81. Organization: The World Public Access UNIX, Brookline, MA
  82.  
  83. In article <summeral.773449984@benji.Colorado.EDU>,
  84. Summerall  Thomas G <summeral@benji.Colorado.EDU> wrote:
  85. >This is probably a common question, so I apologize in advance.
  86. >
  87. >Can the standard system 7 popup cdef use colored menu items?  If so, how?  It
  88. >doesn't seem to recognize mctb resources associated with the menu I'm
  89. >adding.  What am I missing here?  If it isn't a feature of system 7, is
  90. >there a public domain library that can accomplish this?
  91.  
  92. Soon there will be a free CDEF that supports color. My popup CDEF
  93. already does most of what you might wan, but its current version
  94. (1.0b3) doesn't work in color grafports. I'm adding color support
  95. right now, and it should be ready within a week or two. There are
  96. still some bugs (visual appearance things, not crashing) that may
  97. require another release or two before I finally discover the magical
  98. solution. The system 7 CDEF seemed to crash when I added a mctb
  99. resource and tried to display the menu's title. I'm also thinking of
  100. adding coloration using an auxillary control color resource, with part
  101. codes for the text, outline, down arrow, etc. of the control.
  102.  
  103. While on this topic, the width of my CDEF is perfect when run on a
  104. macplus. That is, when the menu is displayed, its width is enlarged to
  105. cover the down arrow and the margins around the menu. But on a Quadra,
  106. the width isn't enlarged, it just is set to the actual width of the
  107. menu. Just before calling PopupMenuSelect I set the menuWidth field of
  108. the menu handle to the desired width, but on the color machine the
  109. width I specify is just being ignored. Does anyone know of some
  110. magical workaround to this problem?
  111. -- 
  112. Ari Halberstadt                                 ari@world.std.com
  113. One generation passes away, and another generation comes: but the
  114. earth abides for ever. -- Ecclesiastes, 1:4.
  115.  
  116. +++++++++++++++++++++++++++
  117.  
  118. >From leonardr@netcom.com (Leonard Rosenthol)
  119. Date: Wed, 13 Jul 1994 21:47:09 GMT
  120. Organization: Aladdin Systems, Inc.
  121.  
  122. In article <Csuw7L.GIn@world.std.com>, ari@world.std.com (Ari I
  123. Halberstadt) wrote:
  124.  
  125. > While on this topic, the width of my CDEF is perfect when run on a
  126. > macplus. That is, when the menu is displayed, its width is enlarged to
  127. > cover the down arrow and the margins around the menu. But on a Quadra,
  128. > the width isn't enlarged, it just is set to the actual width of the
  129. > menu. Just before calling PopupMenuSelect I set the menuWidth field of
  130. > the menu handle to the desired width, but on the color machine the
  131. > width I specify is just being ignored. Does anyone know of some
  132. > magical workaround to this problem?
  133. >
  134.    The problem/situation is that PopupMenuSelect() will call CalcMenuWidth
  135. on the menu before the menu gets drawn and so the MDEF will recalc the
  136. size w/o the arrow :(.   The standard solution to this is to create a
  137. "stub" MDEF which knows to resize the width on a calc message.  If you
  138. need a code sample, let me know.
  139.  
  140.  
  141. Leonard
  142. - ------------------------------------------------------------------------
  143. Leonard Rosenthol                      Internet:       leonardr@netcom.com
  144. Director of Advanced Technology        AppleLink:      MACgician
  145. Aladdin Systems, Inc.                  GEnie:          MACgician
  146.  
  147. ---------------------------
  148.  
  149. >From tgaul@halcyon.com (Troy Gaul)
  150. Subject: Controlling Apple MultiSync Monitors
  151. Date: Fri, 08 Jul 1994 22:57:23 -0700
  152. Organization: Infinity Systems
  153.  
  154. Is there an API that can be used to determine when the resolution of a
  155. MultiSync monitor changes?  Obviously, one could walk the GDevices when
  156. returning from being switched into the foreground, or checked during idle
  157. time, but is there any other way to find out immediately?
  158.  
  159. On a related note, is there any way to force a change of resolution via a
  160. call (or a driver Control call)?  I'm considering an extension that would
  161. facilitate changing monitor resolutions, but I haven't been able to find
  162. the developer notes for MultiSync monitors.
  163.  
  164. Thanks,
  165. _troy
  166. //////// //////___Troy Gaul____________________tgaul@halcyon.com___//
  167.   //    //      Infinity Systems                                  //
  168.  //    //  //  Redmond, Washington                               //
  169. //    //////____________________________________________________//
  170.  
  171. +++++++++++++++++++++++++++
  172.  
  173. >From Dave Falkenburg <falken@apple.com>
  174. Date: Wed, 13 Jul 1994 18:40:06 GMT
  175. Organization: Apple Computer, Inc.
  176.  
  177. In article <tgaul-0807942257230001@bellevue-ip88.halcyon.com> Troy Gaul,
  178. tgaul@halcyon.com writes:
  179. >Is there an API that can be used to determine when the resolution of a
  180. >MultiSync monitor changes?  Obviously, one could walk the GDevices when
  181. >returning from being switched into the foreground, or checked during idle
  182. >time, but is there any other way to find out immediately?
  183.  
  184. Yes, but somehow nobody wrote any tech notes yet.
  185. The API is defined in <Displays.h>, but is cryptic at best.
  186.  
  187. The Display Manager allows an application to install an AppleEvent
  188. handler to detect when a display has been changed (e.g., a new display
  189. has come online because you've docked a Duo, or you change the resolution
  190. of a multisynch monitor via the monitors control panel).
  191.  
  192. BTW: Extensions can supply a callback function instead of relying on an
  193. AppleEvent.
  194.  
  195. In order to receive this AppleEvent, you must set the displayManagerAware
  196. bit in your size resource, and install an AppleEvent Handler for
  197. kCoreEventClass,kSystemConfigNotice (or something like that).
  198.  
  199. NOTE: If you choose to become "display manager aware", you must also be
  200. prepared to deal with the change in displays and keep your windows
  201. onscreen.
  202.  
  203. This is just screaming for a tech note, some sample code, and a develop
  204. or MacTech magazine article.
  205.  
  206. -Dave Falkenburg
  207. -Apple Computer, Inc.
  208.  
  209. +++++++++++++++++++++++++++
  210.  
  211. >From Dave Falkenburg <falken@apple.com>
  212. Date: Wed, 13 Jul 1994 18:43:25 GMT
  213. Organization: Apple Computer, Inc.
  214.  
  215. In article <tgaul-0807942257230001@bellevue-ip88.halcyon.com> Troy Gaul,
  216. tgaul@halcyon.com writes:
  217. >On a related note, is there any way to force a change of resolution via a
  218. >call (or a driver Control call)?  I'm considering an extension that would
  219. >facilitate changing monitor resolutions, but I haven't been able to find
  220. >the developer notes for MultiSync monitors.
  221.  
  222. Oops.  Forgot to mention that all you really need to do this is a special
  223. video adapter cable. I have an NEC 6FG & their "PowerMac" video cable
  224. adpater which converts the Mac's video cable into that industry standard
  225. SVGA type connector.
  226.  
  227. Under System 7.1.2 on a PowerMac, or System 7.5 on most other recent
  228. machines with built in video, all you need to do is go to the Monitors
  229. control panel to swich resolutions.
  230.  
  231. -Dave Falkenburg
  232. -Apple Computer, Inc.
  233.  
  234. ---------------------------
  235.  
  236. >From ron@mcs.com (Ron Schneider)
  237. Subject: Drag Mgr problem w- flavorTypePromiseHFS
  238. Date: Tue, 12 Jul 1994 22:36:36 -0600
  239. Organization: Just a guy...
  240.  
  241.  
  242. I'm playing with the drag manager, and have incorporated it into my app. 
  243. Everything works fine, all my handlers are called, I'm dragging text
  244. between apps, sounds, creating clipping flies, etc.  Most cool.
  245.  
  246. But I can't get flavorTypePromiseHFS to work.  As I'm dragging around, the
  247. Finder correctly hilites applications that accept the file type I specified
  248. in the PromiseHFSFlavor struct, and my DragSendDataProc is called back at
  249. the correct time to return the FSSpec of the created file.  But nothing
  250. ever happens!  The TrackDrag routine returns noErr.  I have AppleEvents
  251. turned on, DragPeek returns the expected results, System 7.1 w/ the
  252. DragManager, Clipping Extension, etc all installed and working.  I am
  253. reduced to random changes hoping to stumble onto the solution.  Here are
  254. some questions I have come up with.
  255.  
  256. 1.  Are there any examples in the universe that show the 'phfs' flavor in
  257. use?  Or anywhere in the finder that uses it so I could use DragPeek to
  258. look at what is happening?
  259.  
  260. 2.  The doc says (I love online docs!) 'This structure (PromiseHFSFlavor)
  261. allows you to create the file in your DragSendDataProc, and provide the
  262. FSSpec for the new file at that time.'  What does this really mean?  In the
  263. DragSendDataProc do I specify a completed HFSFlavor, or a completed FSSpec,
  264. or maybe an alias like all the AppleEvent stuff?  I have tried all, same
  265. non-results.
  266.  
  267. 3. I have noticed the Finder trims its FSSpecs in the 'hfs ' flavors to the
  268. minimum length, whereas it is easier for me to pass sizeof( HFSFlavor ) or
  269. sizeof( FSSpec ), since the filename length is in the structure anyway. 
  270. Does it matter?  (I have tried both).
  271.  
  272. Thanks for any help, suggestions, sympathy, or pointers that you can offer!
  273.  
  274. -- 
  275.  
  276. ron schneider
  277. ron@mcs.com, ron@odesta.com
  278. .sig under construction
  279.  
  280. +++++++++++++++++++++++++++
  281.  
  282. >From leonardr@netcom.com (Leonard Rosenthol)
  283. Date: Wed, 13 Jul 1994 21:53:32 GMT
  284. Organization: Aladdin Systems, Inc.
  285.  
  286. In article <ron-120794223636@ron.pr.mcs.net>, ron@mcs.com (Ron Schneider) wrote:
  287.  
  288. > 1.  Are there any examples in the universe that show the 'phfs' flavor in
  289. > use?  Or anywhere in the finder that uses it so I could use DragPeek to
  290. > look at what is happening?
  291.    I believe that the HFS sample app in the Mac Drag & Drop folder on the
  292. Mozart beta CD (and therefore the WWDC CD) shows what you need to know
  293. about using promise HFS flavors.
  294.  
  295.  
  296.    Here is some "sample" code that should show what how to deal with
  297. promiseHFS flavors in your sendProc.  This code will definitely not
  298. compile as is (it's missing var & function declarations but shows the
  299. important stuff!
  300.  
  301.  
  302. Leonard
  303. - ----------
  304. pascal OSErr SampleSendDataProc(FlavorType theType, void *refCon,
  305. ItemReference theItem, DragReference theDrag)
  306. {  
  307.    OSErr       result = noErr;
  308.    AEDesc         dropLoc, specDesc;
  309.    FSSpec         myFSSpec;
  310.    long        dataSize;
  311.    short       tempVRef;
  312.    long        tempDirID;
  313.  
  314.    if (theType == flavorTypePromiseSample) {
  315.       if (!GetDropLocation(theDrag, &dropLoc)) {
  316.          
  317.          if(!GetDropLocationDirectory(&dropLoc, &defdir, &defvol)) {
  318.             
  319.             dataSize = sizeof(sampleFlavorRec);
  320.             if (result = GetFlavorData(theDrag, theItem, flavorTypeSample,
  321. &mySFRec, &dataSize, 0L))
  322.                goto out;
  323.             
  324.             result = FindFolder(defvol, kTrashFolderType,
  325. kDontCreateFolder, &tempVRef, &tempDirID);
  326.  
  327.             // Check if the destination is the trash - if so delete
  328.             if ((tempVRef == defvol) && (tempDirID == defdir)) {
  329.                if(firstPromise)
  330.                   DeleteIt();
  331.             } else {
  332.                // you’ve been grabbed - do something with the it!!!
  333.                if(!abort) {
  334.                   myFSSpec.vRefNum = defvol;
  335.                   myFSSpec.parID = defdir;
  336.                   NameCopy(string,myFSSpec.name);
  337.  
  338.                   result =
  339. SetDragItemFlavorData(theDrag,theItem,flavorTypePromiseSample,
  340.                                  &myFSSpec,sizeof(FSSpec),0);
  341.                }
  342.                   
  343.             }
  344.             firstPromise = FALSE;
  345.             
  346.          }
  347.       }
  348.       
  349.    } else {
  350.       return(cantGetFlavorErr);
  351.    }
  352.  
  353. out:
  354.  
  355.    return(result ? cantGetFlavorErr : noErr);
  356. }
  357. - ------------------------------------------------------------------------
  358. Leonard Rosenthol                      Internet:       leonardr@netcom.com
  359. Director of Advanced Technology        AppleLink:      MACgician
  360. Aladdin Systems, Inc.                  GEnie:          MACgician
  361.  
  362. ---------------------------
  363.  
  364. >From cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine)
  365. Subject: GWorlds and other questions - Help
  366. Date: Wed, 13 Jul 1994 07:59:52 -0700
  367. Organization: Ministry of Environment, Lands & Parks
  368.  
  369. It seems, no matter how much material I read on GWorlds & CopyBits, et.
  370. al, it doesn't answer some of my main questions.  So I humbly turn to the
  371. experts on the net for your guided support and help.
  372.  
  373. 1)  IM IV says to set RGBForeColor to White and RGBBackColor to Black
  374. before using CopyBits to avoid colorization.  That's great, but I've seen
  375. many examples where people don't do this.  My question is, do you have to
  376. do it for Color GWorlds?
  377.  
  378. 2) I've seen alot about rowBytes and BaseAddr values for PixMaps/BitMaps. 
  379. How you have to set it to long word aligned for fastest copying.  If you
  380. use NewGWorld to create your offscreen port (as opposed to OpenCPort), do
  381. you still need to set these values or does NewGWorld do it for you?
  382.  
  383. 3) Develop 17 (ftp'd from ftp.apple.com) mentions in Brigham Stevens'
  384. article "Ten Tips for Game Developers" to use CopyBits with a mask region
  385. instead of CopyMask or CopyDeepMask because it's faster. OK, but how do I
  386. convert my mask (sitting in a GWorld called maskWorld) to a region.  I
  387. haven't seen any good examples of the use of BitMapToRgn anywhere (I did
  388. look, but got more confused. IM didn't explain how to use this at all and
  389. neither did THINK Reference)
  390.  
  391. 4) Can GetGWorld and SetGWorld be used instead of GetPort and SetPort when
  392. using offscreen GWorlds?
  393.  
  394. 5) I can't seem to find the TechNote anymore called, Out of This GWorld. 
  395. Can someone tell me where to get it (prefereablly in DocViewer Format).
  396.  
  397. Thanks for all your help.
  398.  
  399. Signed,
  400.  
  401. Dazed and Confused.
  402.  
  403. -- 
  404. ========================================================================
  405. Carl B. Constantine                  B.C. Environment, Lands & Parks
  406. End-User Support Analyst             CCONSTAN@epdiv1.env.gov.bc.ca
  407.  
  408. +++++++++++++++++++++++++++
  409.  
  410. >From giles@med.cornell.edu (Aaron Giles)
  411. Date: 13 Jul 1994 17:11:37 GMT
  412. Organization: Cornell University Medical College
  413.  
  414. In article <cconstan-1307940759520001@eusacbc.env.gov.bc.ca>,
  415. cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine) wrote:
  416.  
  417. > 1)  IM IV says to set RGBForeColor to White and RGBBackColor to Black
  418. > before using CopyBits to avoid colorization.  That's great, but I've seen
  419. > many examples where people don't do this.  My question is, do you have to
  420. > do it for Color GWorlds?
  421.  
  422. Yes, you do need it.  (BTW, it's RGBForeColor to *black* and RGBBackColor
  423. to *white*).  If the foreground and background colors are something else,
  424. CopyBits will do color masking, which is a cool effect, but slows things
  425. down a lot.
  426.  
  427. > 2) I've seen alot about rowBytes and BaseAddr values for PixMaps/BitMaps. 
  428. > How you have to set it to long word aligned for fastest copying.  If you
  429. > use NewGWorld to create your offscreen port (as opposed to OpenCPort), do
  430. > you still need to set these values or does NewGWorld do it for you?
  431.  
  432. NewGWorld always allocates longword-aligned chunks of memory for its
  433. screen buffer.  As long as you are copying from a longword-aligned offset
  434. from the baseAdr, you don't need to worry.
  435.  
  436. > 3) Develop 17 (ftp'd from ftp.apple.com) mentions in Brigham Stevens'
  437. > article "Ten Tips for Game Developers" to use CopyBits with a mask region
  438. > instead of CopyMask or CopyDeepMask because it's faster. OK, but how do I
  439. > convert my mask (sitting in a GWorld called maskWorld) to a region.  I
  440. > haven't seen any good examples of the use of BitMapToRgn anywhere (I did
  441. > look, but got more confused. IM didn't explain how to use this at all and
  442. > neither did THINK Reference)
  443.  
  444. I assume you're using cicn's to store your graphics?  If you are, then
  445. look at the structure of a CIconHandle in THINK Reference; in there is a
  446. pointer to a BitMap containing the mask.  Allocate a new RgnHandle with
  447. NewRgn(), then call BitMapToRegion() to convert the mask BitMap into a
  448. region.  It's pretty straightforward.  Something like this:
  449.  
  450. CIconHandle myIcon = GetCIcon(kMyIconID);
  451. if (myIcon) {
  452.     RgnHandle myMaskRgn = NewRgn();
  453.     if (myMaskRgn) {
  454.        char hState = HGetState((Handle)myIcon);
  455.        OSErr theErr;
  456.        HLock((Handle)myIcon);
  457.        theErr = BitMapToRegion(myMaskRgn, &(*myIcon)->iconMask);
  458.        HSetState((Handle)myIcon, hState);
  459.        if (theErr == noErr) // everything worked!
  460.     }
  461. }
  462.  
  463. However, you need to be careful, because the mask BitMap was originally in
  464. the source coordinates of the image, so you could just pass the same mask
  465. to CopyMask() to copy to any destination.  When you start using a mask
  466. region for CopyBits(), however, the region is relative to the
  467. *destination* port, so you will need to call OffsetRgn() on the mask
  468. region to transform it from source to destination coordinates before you
  469. copy.
  470.  
  471. That is, if you were doing CopyMask() to two different locations, you
  472. would just do this:
  473.  
  474. CopyMask((BitMap *)*mySrcPixMap, &myMaskBitMap, (BitMap *)*myDestPixMap,
  475.     &srcRect, &srcRect, &destRect1);
  476. CopyMask((BitMap *)*mySrcPixMap, &myMaskBitMap, (BitMap *)*myDestPixMap,
  477.     &srcRect, &srcRect, &destRect2);
  478.  
  479. However, if you were doing the same thing with CopyBits(), you would need
  480. to do a little more work:
  481.  
  482. RgnHandle myDestRgn = NewRgn();
  483. if (myDestRgn) {
  484.     CopyRgn(myMaskRgn, myDestRgn);
  485.     OffsetRgn(myDestRgn, destRect1.left, destRect1.top);
  486.     CopyBits((BitMap *)*mySrcPixMap, (BitMap *)*myDestPixMap,
  487.         &srcRect, &destRect1, mode, myDestRgn);
  488.     CopyRgn(myMaskRgn, myDestRgn);
  489.     OffsetRgn(myDestRgn, destRect2.left, destRect2.top);
  490.     CopyBits((BitMap *)*mySrcPixMap, (BitMap *)*myDestPixMap,
  491.         &srcRect, &destRect2, mode, myDestRgn);
  492. }
  493.  
  494. > 4) Can GetGWorld and SetGWorld be used instead of GetPort and SetPort when
  495. > using offscreen GWorlds?
  496.  
  497. Yes; in fact, they *must* be used.  I never use SetPort() anymore;
  498. SetGWorld() always does the job and you never have to worry about pointing
  499. to the wrong or nonexistant GDevice.
  500.  
  501. Hope this helps!
  502. Aaron
  503. -- 
  504. Aaron Giles (giles@med.cornell.edu)
  505. Power Macintosh Developer, Cornell University Medical College
  506. JPEGView home page: http://www.med.cornell.edu/jpegview.html
  507. JPEGView FTP site:   ftp://ftp.med.cornell.edu/pub/aarong/jpegview/
  508.  
  509. +++++++++++++++++++++++++++
  510.  
  511. >From gurgle@dnai.com (Pete Gontier)
  512. Date: Wed, 13 Jul 1994 12:22:25 -0800
  513. Organization: Integer Poet Software
  514.  
  515. In article <giles-1307941311120001@wiggin.med.cornell.edu>,
  516. giles@med.cornell.edu (Aaron Giles) wrote:
  517.  
  518. > In article <cconstan-1307940759520001@eusacbc.env.gov.bc.ca>,
  519. > cconstan@epdiv1.env.gov.bc.ca (Carl B. Constantine) wrote:
  520. > > 1)  IM IV says to set RGBForeColor to White and RGBBackColor to Black
  521. > > before using CopyBits to avoid colorization.  That's great, but I've seen
  522. > > many examples where people don't do this.  My question is, do you have to
  523. > > do it for Color GWorlds?
  524. > Yes, you do need it.  (BTW, it's RGBForeColor to *black* and RGBBackColor
  525. > to *white*).  If the foreground and background colors are something else,
  526. > CopyBits will do color masking, which is a cool effect, but slows things
  527. > down a lot.
  528.  
  529. You don't need to do it every time if you think it is slowing your code
  530. down. What you do need to do is assure yourself that the foreground and
  531. background colors are set the way you think they should be set. Most of
  532. the time that's fore/black and back/white. It so happens that these are
  533. the default foreground and background colors, so that accounts for why you
  534. see code which doesn't bother to set them.
  535.  
  536. -- 
  537.  
  538.  Pete Gontier // CTO, Integer Poet Software // gurgle@dnai.com
  539.  
  540.  "I am Wang of Symantec. You will be assimilated. Resistance is futile."
  541.  
  542. ---------------------------
  543.  
  544. >From tzagara@tigris.cti.gr
  545. Subject: PBControl() "hangs" the Macintosh
  546. Date: 12 JUL 94 18:21:00 GMT
  547. Organization: Computer Technology Institute (CTI), Patras, Greece
  548.  
  549. Hi there,
  550.  
  551. I am new in Macintosh programming and I want to write two simple programs 
  552. implementing a client and a server. I am using MacTCP and I am trying to 
  553. open a UDP connection between the client and the server.
  554.  
  555. I am using Think C 5.0 on a MacQuadra 700 and MacTCP 1.1.
  556.  
  557. I wrote the following code trying to open the MacTCP driver and a UDP stream,
  558. but when I try to  "run" it,  the  Macintosh "hangs".
  559.  
  560. - -------------------------------------------------------------------
  561.  
  562. /* Open a UDP stream */
  563.  
  564. #include <PrintTraps.h>
  565. #include <stdio.h>
  566. #include <MacTCPCommonTypes.h>
  567. #include <UDPPB.h>
  568.  
  569. main()
  570. {
  571.  
  572.  short             DrefNum=0;
  573.  UDPiob            myUDPblock;
  574.  CntrlParam        myUDPCblock;
  575.  UDPCreatePB       myUDPCreate;
  576.  Ptr               RcvBuffer;
  577.  OsErr             MyErr;
  578.  char              DriverName[9]="\p.ipp";
  579.  
  580.  myUDPblock.ioCompletion = NULL;
  581.  myUDPblock.ioNamePtr = DriverName;
  582.  myUDPblock.ioCRefNum = 0;
  583.  
  584.  MyErr = PBOpen((ParmBlkPtr)&myUDPblock,false);
  585.  
  586.  DrefNum=myUDPblock.ioCRefNum;
  587.  
  588.  if (MyErr != noErr)
  589.     printf("Error %d\n",MyErr);
  590.  else
  591.     printf("No Error\n");
  592.  
  593.  myUDPCblock.csCode=20;
  594.  myUDPCblock.ioCRefNum=DrefNum;
  595.  myUDPCblock.oCompletion=NULL;
  596.  
  597.  RcvBuffer=(char *)malloc(2048*sizeof(char));
  598.  myUDPCreate.rcvBuff=RcvBuffer;
  599.  myUDPCreate.localPort=0;
  600.  myUDPCreate.endingPort=1500;
  601.  
  602. **>> MyErr=PBControl((ParmBlkPtr)&myUDPCblock,false);  /* At this point the Mac
  603.                                                         "hangs" */
  604.  if (MyErr != noErr)                                 
  605.     printf("PBControl returned error %d\n",MyErr);
  606.  else
  607.     printf("No error returned\n");
  608.  
  609.  
  610. }
  611.  
  612. - ----------------------------------------------------------------------------
  613.  
  614.  
  615. The point where the Macintosh "hangs" is market with **>>. When I use the 
  616. debugger, at the specified point a message appears saying  "Bus Error".
  617.  
  618. Can anybody tell me, what I am doing wrong ?
  619.  
  620. Thank you in advance.
  621.  
  622. ****************************************************************
  623. Emmanuel Tzangarakis, tzagara@cti.gr,   tzagara@grpatvx1.bitnet
  624. Computer Technology Institute (CTI)
  625. Patras,
  626. Greece.
  627.  
  628. +++++++++++++++++++++++++++
  629.  
  630. >From oster@netcom.com (David Phillip Oster)
  631. Date: Tue, 12 Jul 1994 18:34:26 GMT
  632. Organization: Netcom Online Communications Services (408-241-9760 login: guest)
  633.  
  634. In article <12JUL94.18210014@tigris.cti.gr> tzagara@tigris.cti.gr writes:
  635. >I wrote the following code trying to open the MacTCP driver and a UDP stream,
  636. >but when I try to  "run" it,  the  Macintosh "hangs".
  637. >
  638. > myUDPCblock.csCode=20;
  639. > myUDPCblock.ioCRefNum=DrefNum;
  640. > myUDPCblock.oCompletion=NULL;
  641. >
  642. > RcvBuffer=(char *)malloc(2048*sizeof(char));
  643. > myUDPCreate.rcvBuff=RcvBuffer;
  644. > myUDPCreate.localPort=0;
  645. > myUDPCreate.endingPort=1500;
  646. >
  647. >**>> MyErr=PBControl((ParmBlkPtr)&myUDPCblock,false);  /* At this point the Mac
  648. >                                                        "hangs" */
  649. You don't initialize your parameter block, so your code installs garbage
  650. as an ASR. When the mac calls that garbage ASR, it bus errors.
  651.  
  652. The following does almost what you want:
  653.  
  654. /* This is a complete, correct, example of creatign a TCP stream.
  655.     Written and tested by David Phillip Oster, 7/12/94
  656.  */
  657. #include "AddressXlation.h"
  658. #include "UDPPB.h"
  659. #include "TCPPB.h"
  660. #include <string.h>
  661.  
  662. static short tcpRefNum = 0;
  663.  
  664. /* UDPMTU - return UDPMaxMTUSize
  665.  */
  666. static OSErr UDPMTU(ip_addr hostAddr, unsigned short *dgramSize){
  667.     UDPiopb    pb;
  668.     OSErr    err;
  669.  
  670.     if(0 == tcpRefNum){
  671.         return openFailed;
  672.     }
  673.     memset(&pb, 0, sizeof pb);
  674.     pb.ioCRefNum = tcpRefNum;
  675.     pb.csCode = UDPMaxMTUSize;
  676.     pb.csParam.mtu.remoteHost = hostAddr;
  677.     pb.csParam.mtu.userDataPtr = nil;
  678.     if(noErr == (err = PBControl((ParmBlkPtr) &pb, FALSE))){
  679.         *dgramSize = pb.csParam.mtu.mtuSize;
  680.     }
  681.     return err;
  682. }
  683.  
  684. /* TcpCreate - opens a TCP stream.
  685.  */
  686. static OSErr TcpCreate(
  687.     Ptr rcvBuff, 
  688.     unsigned long rcvBuffLen, 
  689.     StreamPtr *streamp){
  690.  
  691.     TCPiopb    pb;
  692.     OSErr    err;
  693.  
  694.     if(0 == tcpRefNum){
  695.         return openFailed;
  696.     }
  697.     memset(&pb, 0, sizeof pb);
  698.     pb.ioCRefNum = tcpRefNum;
  699.     pb.csCode = TCPCreate;
  700.     pb.csParam.create.rcvBuff = rcvBuff;
  701.     pb.csParam.create.rcvBuffLen = rcvBuffLen;
  702.     if(noErr == (err = PBControl((ParmBlkPtr) &pb, FALSE))){
  703.         *streamp = pb.tcpStream;
  704.     }
  705.     return err;
  706. }
  707.  
  708. /* TcpRelease - closes a Tcp stream
  709.  */
  710. static OSErr TcpRelease(StreamPtr stream, Ptr *rcvBuff, long *rcvBuffLen){
  711.     TCPiopb    pb;
  712.     OSErr    err;
  713.  
  714.     if(0 == tcpRefNum){
  715.         return openFailed;
  716.     }
  717.     memset(&pb, 0, sizeof pb);
  718.     pb.ioCRefNum = tcpRefNum;
  719.     pb.csCode = TCPRelease;
  720.     pb.tcpStream = stream;
  721.     if(noErr == (err = PBControl((ParmBlkPtr) &pb, FALSE))){
  722.         *rcvBuff = pb.csParam.create.rcvBuff;
  723.         *rcvBuffLen = pb.csParam.create.rcvBuffLen;
  724.     }
  725.     return err;
  726. }
  727.  
  728.  
  729.  
  730. /* main -
  731.     although it appears that err is unused here, actually, I
  732.     dump it out in the debugger.
  733.  
  734.     weaver is just some host this machine can reach, so I can
  735.     ask how big a buffer to allocate, to hand to the stream.
  736.  */
  737. main(){
  738.     OSErr            err;
  739.     ip_addr            weaver_addr;
  740.     struct hostInfo    weaverInfo;
  741.     unsigned short     dgramSize;
  742.     Ptr                buf, buf2;
  743.     long            bufLen, bufLen2;
  744.     StreamPtr        stream;
  745.  
  746.     weaver_addr = 0;
  747.  
  748.     err = OpenDriver("\p.ipp", &tcpRefNum);    /* opens the MacTCP implementation */
  749.     err = OpenResolver(nil);
  750.     err = StrToAddr("weaver.", &weaverInfo, nil, nil);
  751.     if(noErr == err){
  752.         weaver_addr = weaverInfo.addr[0];
  753.     }
  754.     err = CloseResolver();
  755.     err = UDPMTU(weaver_addr, &dgramSize);
  756.     /* the minimum memory allocation for TCP is 4L*dgramSize + 1024L */
  757.     bufLen = 2048L + 4L*dgramSize;
  758.     buf = NewPtr(bufLen);
  759.     err = MemError();
  760.     err = TcpCreate(buf, bufLen, &stream);
  761.     err = TcpRelease(stream, &buf2, &bufLen2);
  762.     return 0;
  763. }
  764.  
  765. +++++++++++++++++++++++++++
  766.  
  767. >From Mark Hanrek <hanrek@cts.com>
  768. Date: Thu, 14 Jul 1994 07:22:48 GMT
  769. Organization: The Information Workshop
  770.  
  771. In article <12JUL94.18210014@tigris.cti.gr> , tzagara@tigris.cti.gr
  772. writes:
  773.  
  774. > Hi there,
  775. >
  776. > I am new in Macintosh programming and I want to write two simple
  777. programs 
  778. > implementing a client and a server. I am using MacTCP and I am trying
  779. to 
  780. > open a UDP connection between the client and the server.
  781. >
  782. > I am using Think C 5.0 on a MacQuadra 700 and MacTCP 1.1.
  783. >
  784. > I wrote the following code trying to open the MacTCP driver and a UDP
  785. stream,
  786. > but when I try to  "run" it,  the  Macintosh "hangs".
  787. >
  788.  
  789. < source code not included>
  790.  
  791. >
  792. >
  793. > The point where the Macintosh "hangs" is market with **>>. When I use
  794. the 
  795. > debugger, at the specified point a message appears saying  "Bus Error".
  796. >
  797. > Can anybody tell me, what I am doing wrong ?
  798. >
  799. > Thank you in advance.
  800. >
  801. > ****************************************************************
  802. > Emmanuel Tzangarakis, tzagara@cti.gr,   tzagara@grpatvx1.bitnet
  803. > Computer Technology Institute (CTI)
  804. > Patras,
  805. > Greece.
  806.  
  807.  
  808. Emmanuel,
  809.  
  810. Your *real* problem is that you did not first draw from working example
  811. source code.  
  812.  
  813. Fortunately, David Oster supplied you with an excellent, and "known to be
  814. working" example.  When you look at it, and compare it to yours, you will
  815. see that there are significant differences.
  816.  
  817. The only way to be successful in programming these days is to "stand on
  818. the shoulders of work already done" -- because there is still quite a bit
  819. to do after that. :)
  820.  
  821. If you tackle each programming task all over from scratch, it could take
  822. you weeks, or even months to duplicate the effort that went into David's
  823. code alone.  It is okay for you to stand on the shoulders of that work
  824. and utilize it directly.  If it was not okay, David would have politely
  825. let you know.
  826.  
  827. - ---
  828.  
  829. I would wager that the mistake you made is a common one, which is using
  830. "parameter block" type calls without first initializing them to zero.
  831.  
  832. Your parameter block structures are allocated on the stack, but they are
  833. not initialized, so there is random stuff in all of the parameter block's
  834. fields.  You are setting the values of some of them, but what about the
  835. rest?
  836.  
  837. ooops. :)
  838.  
  839. The toolbox call you are making may be looking at some of the other
  840. parameter block field and perhaps if on of them is not nil, then it
  841. figures it must be good a valid address, and so it uses the address in
  842. that field, not knowing that is is actually a random value -- bus error!
  843.  
  844. In David's code, the "memset" call is used to initialize a parameter
  845. block before it is used.  Now you will remember this from now on, I am
  846. sure!
  847.  
  848. I made the same mistake, too, and will always remember it. :)
  849.  
  850. Keep working at it!
  851.  
  852.  
  853. Mark Hanrek
  854.  
  855. ---------------------------
  856.  
  857. >From Dmitry Boldyrev <dmtiry@atlas.chem.utah.edu>
  858. Subject: Patching the GetResource() toolbox routine
  859. Date: 8 Jul 1994 01:51:15 GMT
  860. Organization: University of Utah
  861.  
  862. Hi folx!
  863. I am the author of LZSS Res resource compression utility. The way LZSS Res
  864. works now
  865. is, it has a library function called GetCResource(rType, rID) which has
  866. a call inside it to GetResource, then, the resource is decompressed in real
  867. time
  868. and returned. However, it is a not very convinient way of doing that, that is
  869. someone who's using my package would have to change GetPicture to 
  870. (PicHandle)GetCResource() and so on.. you see, it is not a good way. 
  871. Yesterday, I spoke to the current president of TopSoft, inc. Tony Jacobs who
  872. suggested me another idea, to patch the trap GetResource() so that
  873. whenever someone makes a call GetResource() actually my function will be called
  874. and the resource will be grabbed decompressed and passed. 
  875. Now, is there a way to do it?
  876.  
  877. Greatly appreciate any info.
  878.  
  879. +++++++++++++++++++++++++++
  880.  
  881. >From radixinc@aol.com (RadixInc)
  882. Date: 8 Jul 1994 02:39:01 -0400
  883. Organization: America Online, Inc. (1-800-827-6364)
  884.  
  885. In article <2vibej$fve@u.cc.utah.edu>, Dmitry Boldyrev
  886. <dmtiry@atlas.chem.utah.edu> writes:
  887.  
  888. "...suggested me another idea, to patch the trap GetResource() so that
  889. whenever someone makes a call GetResource() actually my function will be
  890. called and the resource will be grabbed decompressed and passed.  Now, is
  891. there a way to do it?"
  892.  
  893. First off, you'll have to patch more than just GetResource. There are
  894. quite a few calls that load resources: GetResource, GetNamedResource,
  895. Get1Resource, Get1NamedResource, LoadResource, and some others. I suspect
  896. they all come down to a call into LoadResource, but the ROM won't get
  897. there through a trap, so you'll probably have to patch them all.
  898.  
  899. Second, you'll have to do your thing AFTER the toolbox gets the resource,
  900. so your patch will do the actual GetResource (or whatever), then
  901. decompress the result and return it. The problem is that by this time the
  902. Resource Manager has already allocated a handle for the resource and made
  903. an entry in the resource map. If you then decompress the resource into
  904. another (larger) block and return a handle to that block to the caller,
  905. you have a bit of a mess to clean up. First you'll have to get rid of the
  906. resource manager's copy, with ReleaseResource. Then you'll have to patch
  907. the ReleaseResource, DetachResource, and perhaps some other calls that
  908. will be expecting resource handles, just in case the calling program
  909. decides to do a resource call with the handle you gave it. The main
  910. problem here is that resource handles are NOT the same as other blocks;
  911. the Resource Manager keeps a private list or map of resources in the heap.
  912.  
  913. Obviously you'll have to install your patch(es) in the System Heap at boot
  914. time (with an INIT) so they will be global to all applications. You'll
  915. probably then find out how many other INITs patch the Resource Manager,
  916. with possibly frustrating results. Your code isn't the only thing that
  917. compresses and decompresses resources, so it had better be able to
  918. identify those it has compressed and ignore anything else.
  919.  
  920. In short, this could get messy.
  921.  
  922. Gregory Jorgensen
  923. XCommander
  924. Radix Consulting Inc.
  925.  
  926. +++++++++++++++++++++++++++
  927.  
  928. >From benmartz@grex.cyberspace.org (Ben Martz)
  929. Date: 12 Jul 1994 02:08:23 GMT
  930. Organization: PawPrint Enterprises
  931.  
  932. In article <2vibej$fve@u.cc.utah.edu>, dmtiry@atlas.chem.utah.edu (Dmitry
  933. Boldyrev) wrote:
  934.  
  935. > I am the author of LZSS Res resource compression utility. The way LZSS Res
  936. > ...
  937. > ... However, it is a not very convinient way of doing that...
  938. > ..suggested me another idea, to patch the trap GetResource() so that
  939. > whenever someone makes a call GetResource() actually my function will be
  940. > called and the resource will be grabbed decompressed and passed. 
  941. > Now, is there a way to do it?
  942. > Greatly appreciate any info.
  943.  
  944. Ok, Dmitry, first of all, a disclaimer, if you don't have a way to
  945. determine if the resource is compressed, ADD ONE! Source code - from the
  946. way you wrote your article, it looks like you are using C so here's some C
  947. code for an INIT to patch a trap and call the original one:
  948.  
  949. /* GR_Patch.c, GetResource patch -- MAY NEED SOME WORK TO WORK! */
  950. #include <SetUpA4.h>
  951.  
  952. #define CODE_SETUP() asm {\
  953.                 movem.l    a0-a5/D0-D7, -(SP)\
  954.                 move.l        a0, a4\
  955.             }
  956. #define CODE_CLEANUP() asm {\
  957.                 movem.l    (SP)+, a0-a5/D0-D7\
  958.             }
  959.             
  960. #define GrafSize        206
  961. #define ADD_GRAFSIZE    (GrafSize - 130)
  962. typedef struct
  963. {
  964.     char        filler[ADD_GRAFSIZE];
  965.     long        randSeed;
  966.     BitMap        screenBits;
  967.     Cursor        arrow;
  968.     Pattern        dkGray;
  969.     Pattern        ltGray;
  970.     Pattern        gray;
  971.     Pattern        black;
  972.     Pattern        white;
  973.     GrafPtr        thePort;
  974. } QD_GLOBALS;
  975.  
  976. #ifndef NULL
  977. #define NULL ( (void *)0 )
  978. #endif
  979.  
  980. static QD_GLOBALS our_qd;
  981.  
  982. #define GetResource_Address 0xA9A0 /* yes this is the right address! */
  983. /* define our routine*/
  984. pascal Handle our_GetResource(ResType rType, short rID);
  985. static void *old_GetResource;
  986.  
  987. void main(void) {
  988.     Handle    self_handle;
  989.     Ptr selfPtr;
  990.         
  991.     CODE_SETUP();
  992.     asm { move.l a0, selfPtr }
  993.     self_handle = RecoverHandle(selfPtr);
  994.     HLock(self_handle);
  995.     DetachResource(self_handle);
  996.         
  997.     /* get the old routine's address for future use! */
  998.     old_GetResource = (void *)NGetTrapAddress(GetResource_Address, ToolTrap);
  999.     /* substitute our routine! */
  1000.     NSetTrapAddress((UniversalProcPtr)StripAddress(our_GetResource),
  1001.                     GetResource_Address, ToolTrap);
  1002.     
  1003.     CODE_CLEANUP();
  1004. }
  1005.  
  1006. pascal Handle our_GetResource(ResType rType, short rID) {
  1007.     Handle returnValue;
  1008.     
  1009.     CODE_SETUP();
  1010.     SetUpA4();
  1011.     
  1012.     /* call the old GetResource to get the resource */
  1013.     returnValue = CallPascalL(old_GetResource, rType, rID);
  1014.     
  1015.     /* first, check to see if the resource is compressed, if so, */
  1016.  /* decompress resource here! */
  1017.     
  1018.     RestoreA4();
  1019.     CODE_CLEANUP();
  1020.     return(returnValue);
  1021. }
  1022.  
  1023.  
  1024. /* end of file */
  1025.  
  1026. BTW: I don't think that this code is powerpc compatible unless you compile
  1027. it as 68K code
  1028.  
  1029.  
  1030. Hope that this helps!
  1031.  
  1032. - Ben
  1033.  
  1034.  
  1035. -CUT HERE------------------------------------------------------------------
  1036.  
  1037.            +---------------+        --------------------------------------
  1038.           / +-----------+ /        -- Ben Martz                        --
  1039.          / /  ()   ()  / /        -- benmartz@grex.cyberspace.org     --
  1040.         / /     ^     / /        -- currently residing in Ann Arbor, --
  1041.        / /  ______   / /        --       Michigan                   --
  1042.       / /  \-----/  / /        --------------------------------------
  1043.      / +-----------+ /        -- The views and opinions expressed --
  1044.     /        _____  /        --  here are mine and no one elses! --
  1045.    / *....         /        --------------------------------------
  1046.   +---------------+        -- "Football can touch a young man  --
  1047.   / / / / / / / /         -- where nobody else can...legally" --
  1048.  +-------------+         --------------------------------------=
  1049.  
  1050. +++++++++++++++++++++++++++
  1051.  
  1052. >From devans@apple.com (Dave Evans)
  1053. Date: Wed, 13 Jul 1994 09:10:21 GMT
  1054. Organization: N/A
  1055.  
  1056. In article <2vibej$fve@u.cc.utah.edu>, Dmitry Boldyrev
  1057. <dmtiry@atlas.chem.utah.edu> wrote:
  1058. > The way LZSS Res works now is, it has a
  1059. > library function called GetCResource(rType, rID) which has a call inside
  1060. > it to GetResource, then, the resource is decompressed in real time
  1061. > and returned. However, it is a not very convinient way of doing that, that is
  1062. > someone who's using my package would have to change GetPicture to 
  1063. > (PicHandle)GetCResource() and so on.. you see, it is not a good way. 
  1064.  
  1065. Please Dmtiry, DON'T PATCH.  Even if more technically challenging, patching
  1066. only makes your software less stable, less compatible, and much more
  1067. difficult to maintain across system software versions.  Also, your patches
  1068. may very well break other applications;  you would need to test many
  1069. applications to verify that your software was successful.  If you stick
  1070. with a linked library, you will avoid all of this.
  1071.  
  1072. Now, to solve your problem, I recommend you provide a library with many
  1073. routines instead of just one routine.  Name them, for example:
  1074.  
  1075. DBGetResource()
  1076. DBGet1Resource()
  1077. DBGetPicture()
  1078.  
  1079. etc.  The DB is for your name's initials, just to designate your
  1080. routines as separate from the Mac Toolbox routines.  Then write very
  1081. small routines for each which call your GetCResource() routine
  1082. as appropriate or Macro's which redefine them to casted GetCResource()
  1083. calls.  You can then also provide a header file which optionally
  1084. defines all the developer's routines to be yours instead.  E.G.:
  1085.  
  1086. #if hasDmtiryLibrary
  1087. #define GetResource(...)  DBGetResource()
  1088. #endif
  1089.  
  1090. So they don't need to change their code and can easily use your
  1091. software...  AND no patching!!!
  1092.  
  1093. Dave
  1094.  
  1095. ---------------------------
  1096.  
  1097. End of C.S.M.P. Digest
  1098. **********************
  1099.  
  1100.  
  1101.  
  1102.